#include <gtk/gtklabel.h>
#include <gtk/gtklistbox.h>
#include <gtk/gtkmessagedialog.h>
+#include <gtk/gtkpicture.h>
#include <gtk/gtkpopover.h>
#include <gtk/gtktogglebutton.h>
#include <gtk/gtktreelistmodel.h>
#include "gtk/gtkrendernodepaintableprivate.h"
#include "recording.h"
-#include "rendernodeview.h"
#include "renderrecording.h"
#include "startrecording.h"
if (GTK_INSPECTOR_IS_RENDER_RECORDING (recording))
{
- GListModel *root_model;
+ GListStore *root_model;
+ graphene_rect_t bounds;
+ GskRenderNode *node;
+ GdkPaintable *paintable;
- gtk_render_node_view_set_render_node (GTK_RENDER_NODE_VIEW (priv->render_node_view),
- gtk_inspector_render_recording_get_node (GTK_INSPECTOR_RENDER_RECORDING (recording)));
- gtk_render_node_view_set_clip_region (GTK_RENDER_NODE_VIEW (priv->render_node_view),
- gtk_inspector_render_recording_get_clip_region (GTK_INSPECTOR_RENDER_RECORDING (recording)));
- gtk_render_node_view_set_viewport (GTK_RENDER_NODE_VIEW (priv->render_node_view),
- gtk_inspector_render_recording_get_area (GTK_INSPECTOR_RENDER_RECORDING (recording)));
+ node = gtk_inspector_render_recording_get_node (GTK_INSPECTOR_RENDER_RECORDING (recording));
+ gsk_render_node_get_bounds (node, &bounds);
+ paintable = gtk_render_node_paintable_new (node, &bounds);
+ gtk_picture_set_paintable (GTK_PICTURE (priv->render_node_view), paintable);
- root_model = create_list_model_for_render_node (gtk_inspector_render_recording_get_node (GTK_INSPECTOR_RENDER_RECORDING (recording)));
+ root_model = g_list_store_new (GDK_TYPE_PAINTABLE);
+ g_list_store_append (root_model, paintable);
priv->render_node_model = gtk_tree_list_model_new (FALSE,
- root_model,
+ G_LIST_MODEL (root_model),
TRUE,
create_list_model_for_render_node_paintable,
NULL, NULL);
g_object_unref (root_model);
+ g_object_unref (paintable);
}
else
{
- gtk_render_node_view_set_render_node (GTK_RENDER_NODE_VIEW (priv->render_node_view), NULL);
+ gtk_picture_set_paintable (GTK_PICTURE (priv->render_node_view), NULL);
}
gtk_list_box_bind_model (GTK_LIST_BOX (priv->render_node_list),
{
GtkInspectorRecorderPrivate *priv = gtk_inspector_recorder_get_instance_private (recorder);
GskRenderNode *node;
+ GdkPaintable *paintable;
+ GtkTreeListRow *row_item;
- node = get_selected_node (recorder);
- if (node == NULL)
+ if (row == NULL)
{
gtk_widget_set_sensitive (priv->render_node_save_button, FALSE);
return;
}
+ row_item = g_list_model_get_item (G_LIST_MODEL (priv->render_node_model),
+ gtk_list_box_row_get_index (row));
+ paintable = gtk_tree_list_row_get_item (row_item);
+
gtk_widget_set_sensitive (priv->render_node_save_button, TRUE);
- gtk_render_node_view_set_render_node (GTK_RENDER_NODE_VIEW (priv->render_node_view), node);
+ gtk_picture_set_paintable (GTK_PICTURE (priv->render_node_view), paintable);
+ node = gtk_render_node_paintable_get_render_node (GTK_RENDER_NODE_PAINTABLE (paintable));
populate_render_node_properties (GTK_LIST_STORE (priv->render_node_properties), node);
+
+ g_object_unref (paintable);
+ g_object_unref (row_item);
}
static void
+++ /dev/null
-/*
- * Copyright (c) 2016 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "rendernodeview.h"
-
-#include <cairo-gobject.h>
-#include <glib/gi18n-lib.h>
-#include <math.h>
-
-#include <gtk/gtksnapshot.h>
-
-#include "gsk/gskrendernodeprivate.h"
-
-#include "fallback-c89.c"
-
-typedef struct _GtkRenderNodeViewPrivate GtkRenderNodeViewPrivate;
-struct _GtkRenderNodeViewPrivate
-{
- GdkRectangle viewport;
- GskRenderNode *render_node;
- cairo_region_t *clip_region;
-};
-
-enum
-{
- PROP_0,
- PROP_VIEWPORT,
- PROP_RENDER_NODE,
- PROP_CLIP_REGION,
- LAST_PROP
-};
-
-static GParamSpec *props[LAST_PROP] = { NULL, };
-
-G_DEFINE_TYPE_WITH_PRIVATE (GtkRenderNodeView, gtk_render_node_view, GTK_TYPE_WIDGET)
-
-static gboolean
-gtk_render_node_view_has_viewport (GtkRenderNodeView *view)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- return priv->viewport.width > 0
- && priv->viewport.height > 0;
-}
-
-static void
-gtk_render_node_view_get_effective_viewport (GtkRenderNodeView *view,
- GdkRectangle *viewport)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- if (gtk_render_node_view_has_viewport (view))
- {
- *viewport = priv->viewport;
- }
- else if (priv->render_node != NULL)
- {
- graphene_rect_t bounds;
-
- gsk_render_node_get_bounds (priv->render_node, &bounds);
-
- viewport->x = bounds.origin.x;
- viewport->y = bounds.origin.y;
- viewport->width = bounds.size.width;
- viewport->height = bounds.size.height;
- }
- else
- {
- *viewport = (GdkRectangle) { 0, 0, 0, 0 };
- }
-}
-
-static void
-gtk_render_node_view_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GtkRenderNodeView *view = GTK_RENDER_NODE_VIEW (object);
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- switch (param_id)
- {
- case PROP_VIEWPORT:
- if (gtk_render_node_view_has_viewport (view))
- g_value_set_boxed (value, &priv->viewport);
- else
- g_value_set_boxed (value, NULL);
- break;
-
- case PROP_RENDER_NODE:
- g_value_set_pointer (value, priv->render_node);
- break;
-
- case PROP_CLIP_REGION:
- g_value_set_boxed (value, priv->clip_region);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gtk_render_node_view_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GtkRenderNodeView *view = GTK_RENDER_NODE_VIEW (object);
-
- switch (param_id)
- {
- case PROP_VIEWPORT:
- gtk_render_node_view_set_viewport (view, g_value_get_boxed (value));
- break;
-
- case PROP_RENDER_NODE:
- gtk_render_node_view_set_render_node (view, g_value_get_pointer (value));
- break;
-
- case PROP_CLIP_REGION:
- gtk_render_node_view_set_clip_region (view, g_value_get_boxed (value));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gtk_render_node_view_dispose (GObject *object)
-{
- GtkRenderNodeView *view = GTK_RENDER_NODE_VIEW (object);
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- g_clear_pointer (&priv->render_node, gsk_render_node_unref);
- g_clear_pointer (&priv->clip_region, cairo_region_destroy);
-
- G_OBJECT_CLASS (gtk_render_node_view_parent_class)->dispose (object);
-}
-
-static void
-gtk_render_node_view_measure (GtkWidget *widget,
- GtkOrientation orientation,
- int for_size,
- int *minimum,
- int *natural,
- int *minimum_baseline,
- int *natural_baseline)
-{
- GtkRenderNodeView *view = GTK_RENDER_NODE_VIEW (widget);
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
- GdkRectangle viewport;
-
- *minimum = 1;
-
- if (priv->render_node == NULL)
- {
- *natural = *minimum;
- return;
- }
-
- gtk_render_node_view_get_effective_viewport (view, &viewport);
- if (for_size < 0)
- {
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- *natural = viewport.width;
- else
- *natural = viewport.height;
- }
- else
- {
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- if (for_size > viewport.height)
- *natural = viewport.width;
- else
- *natural = ceil ((double) for_size * viewport.width / viewport.height);
- }
- else
- {
- if (for_size > viewport.width)
- *natural = viewport.height;
- else
- *natural = ceil ((double) for_size * viewport.height / viewport.width);
- }
- }
-}
-
-static void
-gtk_render_node_view_snapshot (GtkWidget *widget,
- GtkSnapshot *snapshot)
-{
- GtkRenderNodeView *view = GTK_RENDER_NODE_VIEW (widget);
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
- GdkRectangle viewport;
- graphene_rect_t rect;
- int width, height;
- cairo_t *cr;
-
- if (priv->render_node == NULL)
- return;
-
- gtk_render_node_view_get_effective_viewport (view, &viewport);
- width = gtk_widget_get_width (widget);
- height = gtk_widget_get_height (widget);
-
- graphene_rect_init (&rect, 0, 0, width, height);
- cr = gtk_snapshot_append_cairo (snapshot,
- &rect);
-
- cairo_translate (cr, width / 2.0, height / 2.0);
- if (width < viewport.width || height < viewport.height)
- {
- double scale = MIN ((double) width / viewport.width, (double) height / viewport.height);
- cairo_scale (cr, scale, scale);
- }
- cairo_translate (cr, - viewport.x - viewport.width / 2.0, - viewport.y - viewport.height / 2.0);
-
- gsk_render_node_draw (priv->render_node, cr);
-
- if (priv->clip_region)
- {
- cairo_region_t *draw;
-
- draw = cairo_region_create_rectangle (&viewport);
- cairo_region_subtract (draw, priv->clip_region);
-
- cairo_set_source_rgba (cr, 0, 0, 0, 0.5);
- gdk_cairo_region (cr, draw);
- cairo_fill (cr);
-
- cairo_region_destroy (draw);
- }
-
- cairo_destroy (cr);
-}
-
-static void
-gtk_render_node_view_class_init (GtkRenderNodeViewClass *klass)
-{
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->get_property = gtk_render_node_view_get_property;
- object_class->set_property = gtk_render_node_view_set_property;
- object_class->dispose = gtk_render_node_view_dispose;
-
- widget_class->measure = gtk_render_node_view_measure;
- widget_class->snapshot = gtk_render_node_view_snapshot;
-
- props[PROP_VIEWPORT] =
- g_param_spec_boxed ("viewport",
- "Viewport",
- "Viewport",
- CAIRO_GOBJECT_TYPE_RECTANGLE_INT,
- G_PARAM_READWRITE);
-
- props[PROP_RENDER_NODE] =
- g_param_spec_pointer ("render-node",
- "Render node",
- "Render node",
- /* GSK_TYPE_RENDER_NODE, */
- G_PARAM_READWRITE);
-
- props[PROP_CLIP_REGION] =
- g_param_spec_boxed ("clip-region",
- "Clip region",
- "Clip region",
- CAIRO_GOBJECT_TYPE_REGION,
- G_PARAM_READWRITE);
-
- g_object_class_install_properties (object_class, LAST_PROP, props);
-}
-
-static void
-gtk_render_node_view_init (GtkRenderNodeView *view)
-{
- gtk_widget_set_has_surface (GTK_WIDGET (view), FALSE);
-}
-
-GtkWidget *
-gtk_render_node_view_new (void)
-{
- return g_object_new (GTK_TYPE_RENDER_NODE_VIEW, NULL);
-}
-
-void
-gtk_render_node_view_set_render_node (GtkRenderNodeView *view,
- GskRenderNode *node)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- if (priv->render_node == node)
- return;
-
- g_clear_pointer (&priv->render_node, gsk_render_node_unref);
- if (node)
- priv->render_node = gsk_render_node_ref (node);
-
- if (gtk_render_node_view_has_viewport (view))
- gtk_widget_queue_draw (GTK_WIDGET (view));
- else
- gtk_widget_queue_resize (GTK_WIDGET (view));
-
- g_object_notify_by_pspec (G_OBJECT (view), props[PROP_RENDER_NODE]);
-}
-
-GskRenderNode *
-gtk_render_node_view_get_render_node (GtkRenderNodeView *view)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- return priv->render_node;
-}
-
-void
-gtk_render_node_view_set_viewport (GtkRenderNodeView *view,
- const GdkRectangle *viewport)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- if (viewport)
- {
- priv->viewport = *viewport;
- }
- else
- {
- priv->viewport = (GdkRectangle) { 0, 0, 0, 0 };
- }
-
- gtk_widget_queue_resize (GTK_WIDGET (view));
-
- g_object_notify_by_pspec (G_OBJECT (view), props[PROP_VIEWPORT]);
-}
-
-void
-gtk_render_node_view_get_viewport (GtkRenderNodeView *view,
- GdkRectangle *viewport)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- *viewport = priv->viewport;
-}
-
-void
-gtk_render_node_view_set_clip_region (GtkRenderNodeView *view,
- const cairo_region_t *clip)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- if (priv->clip_region)
- cairo_region_destroy (priv->clip_region);
- priv->clip_region = cairo_region_copy (clip);
-
- gtk_widget_queue_draw (GTK_WIDGET (view));
-
- g_object_notify_by_pspec (G_OBJECT (view), props[PROP_CLIP_REGION]);
-}
-
-const cairo_region_t*
-gtk_render_node_view_get_clip_region (GtkRenderNodeView *view)
-{
- GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
- return priv->clip_region;
-}
-
-
-// vim: set et sw=2 ts=2:
+++ /dev/null
-/*
- * Copyright (c) 2016 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _GTK_RENDER_NODE_VIEW_H_
-#define _GTK_RENDER_NODE_VIEW_H_
-
-#include <gtk/gtkbin.h>
-
-#define GTK_TYPE_RENDER_NODE_VIEW (gtk_render_node_view_get_type())
-#define GTK_RENDER_NODE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_RENDER_NODE_VIEW, GtkRenderNodeView))
-#define GTK_RENDER_NODE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_RENDER_NODE_VIEW, GtkRenderNodeViewClass))
-#define GTK_IS_RENDER_NODE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_RENDER_NODE_VIEW))
-#define GTK_IS_RENDER_NODE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_RENDER_NODE_VIEW))
-#define GTK_RENDER_NODE_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_RENDER_NODE_VIEW, GtkRenderNodeViewClass))
-
-
-typedef struct _GtkRenderNodeView
-{
- GtkWidget parent;
-} GtkRenderNodeView;
-
-typedef struct _GtkRenderNodeViewClass
-{
- GtkWidgetClass parent;
-} GtkRenderNodeViewClass;
-
-G_BEGIN_DECLS
-
-GType gtk_render_node_view_get_type (void);
-
-GtkWidget * gtk_render_node_view_new (void);
-
-void gtk_render_node_view_set_render_node (GtkRenderNodeView *view,
- GskRenderNode *node);
-GskRenderNode * gtk_render_node_view_get_render_node (GtkRenderNodeView *view);
-void gtk_render_node_view_set_viewport (GtkRenderNodeView *view,
- const GdkRectangle *viewport);
-void gtk_render_node_view_get_viewport (GtkRenderNodeView *view,
- GdkRectangle *viewport);
-void gtk_render_node_view_set_clip_region (GtkRenderNodeView *view,
- const cairo_region_t *clip);
-const cairo_region_t*
- gtk_render_node_view_get_clip_region (GtkRenderNodeView *view);
-
-
-G_END_DECLS
-
-#endif // _GTK_RENDER_NODE_VIEW_H_
-
-// vim: set et sw=2 ts=2: